<?php
/**
 * mvc 系统函数 functions.php
 * User: www.minyifei.cn
 * Date: 15/4/23
 */

/**
 * 获取纯字符串
 * @param $name
 * @return null
 */
function getUrlString($name)
{
    $value = filter_input(INPUT_GET, $name, FILTER_SANITIZE_STRIPPED);
    if ($value) {
        return $value;
    } else {
        return null;
    }
}

/**
 * mvc路由解析器,负责从参数中提取url路由信息
 */
function getMvcRoute(){
    //控制器
    $c = getUrlString("_c");
    //执行方法
    $a = getUrlString("_a");
    //url rewrite 读取路由,如 teacher_center/profile解析为$c=teacher_center,$a=profile
    $s = getUrlString("_url");
    if(!empty($s)){
        $s = trim(str_replace("/", " ", $s));
        $urls = explode(" ", $s);
        if (isset($urls[0])) {
            $c = $urls[0];
        }
        if (isset($urls[1])) {
            $a = $urls[1];
        }
    }
    //默认访问方法为 index
    if(empty($a)){
        $a = "index";
    }
    //默认控制器为 index
    if(empty($c)){
        $c = "index";
    }
    //路由
    $route = array(
        "_a"=>$a,
        "_c"=>$c,
    );
    session("_urls",$route);
    session("_url",sprintf("%s/%s",$c,$a));
    $cs = explode("_",$c);
    for ($index = 0; $index < count($cs); $index++) {
        $cs[$index] = mb_ucfirst($cs[$index]);
    }
    $c = implode("",$cs);
    $route["a"]=$a;
    $route["c"]=$c;
    return $route;
}

/**
 * 读取配置文件内容
 * @param null $name
 * @return null
 */
function C($name = null)
{
    global $_config;
    if (!strpos($name, '.')) {
        return isset($_config[$name]) ? $_config[$name] : null;
    }
    // 二维数组设置和获取支持
    $name = explode('.', $name);
    return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
}

/**
 * 自动加载类
 * @param String $className 类名
 * @throws Exception
 */
function loader($className)
{
    $file = getClassFile($className);
    if (is_file($file)) {
        require_once($file);
    }
}

/**
 * 获取类绝对文件路径
 * @global $namespaces
 * @param $className
 * @return string
 */
function getClassFile($className)
{
    global $namespaces;
    $names = explode("\\", $className);
    $class = array_pop($names);
    $key = join("\\", $names);
    //系统命名空间
    if ($key == "Myf\Mvc") {
        $path = APP_SYS_PATH;
    } else {
        $path = $namespaces[$key];
    }
    $file = $path . "/" . $class . ".php";
    return $file;
}



/**
 * 驼峰命名转下划线命名，如 UserName => user_name
 * @param string $s
 * @return string
 */
function toUnderLineName($s)
{
    $s = lcfirst($s);
    $chars = str_split($s);
    $res = "";
    foreach ($chars as $c) {
        if (isCapitalLetter($c)) {
            $c = "_" . strtolower($c);
        }
        $res .= $c;
    }
    return $res;
}


/**
 * 获取类的文件名
 * @global type $namespaces
 * @param type $className
 * @return type
 */
function getClassFileName($className)
{
    global $namespaces;
    $names = explode("\\", $className);
    $class = array_pop($names);
    return $class;
}


/**
 * 判断字符串是否为大写字母
 * @param type $c
 * @return boolean
 */
function isCapitalLetter($c)
{
    if (preg_match('/^[A-Z]+$/', $c)) {
        return true;
    } else {
        return false;
    }
}

/**
 * 循环创建文件夹
 * @param $dir
 * @return bool
 */
function createFolders($dir) {
    return is_dir($dir) or (createFolders(dirname($dir)) and mkdir($dir, 0777));
}


/**
 * 首字母大写
 * @param $string
 * @param string $e
 * @return string
 */
function mb_ucfirst($string, $e='utf-8')
{
    if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
        $string = mb_strtolower($string, $e);
        $upper = mb_strtoupper($string, $e);
        preg_match('#(.)#us', $upper, $matches);
        $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
    } else {
        $string = ucfirst($string);
    }
    return $string;
}

/**
 * 获取当前时间毫秒数
 * @return float
 */
function getMillisecond(){
    list($s1, $s2) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
}

/**
 * 获取当前时间
 * @return bool|string
 */
function getCurrentTime() {
    return date("Y-m-d H:i:s");
}


/**
 * 获取项目基础相对URL
 * @return string
 */
function getBasePath()
{
    $sitePath = dirname($_SERVER['SCRIPT_NAME']);
    if ($sitePath == "/" || $sitePath == "\\") {
        $sitePath = "";
    }
    return $sitePath;
}

function getBaseURL()
{
    return getBasePath();
}

/**
 * 获取项目基础绝对URL
 * @return string
 */
function getFullURL()
{
    $pageURL = 'http://';
    $sitePath = getBasePath();
    $host = $_SERVER["HTTP_HOST"];
    $port = $_SERVER["SERVER_PORT"];
    if ($port != "80") {
        $pageURL .= $host . $sitePath;
    } else {
        $pageURL .= str_replace(":80", "", $host) . $sitePath;
    }
    return $pageURL;
}

/**
 * 获取项目相对URL路径
 * @return null
 */
function getProjectURL()
{
    $sysPath = dirname(dirname(__FILE__));
    $cwd = getcwd();
    $filepath = str_replace($sysPath, "", $cwd);
    $url = str_replace($filepath, "", getFullURL());
    return $url;
}


/**
 * session管理
 * @param $name
 * @param string $value
 */
function session($name, $value = '')
{
    $prefix = "myf_";
    if ('' === $value) {
        if (0 === strpos($name, '[')) {// session 操作
            if ('[pause]' == $name) {// 暂停session
                session_write_close();
            } elseif ('[start]' == $name) {// 启动session
                session_start();
            } elseif ('[destroy]' == $name) {// 销毁session
                $_SESSION = array();
                session_unset();
                session_destroy();
            } elseif ('[regenerate]' == $name) {// 重新生成id
                session_regenerate_id();
            }
        } elseif (0 === strpos($name, '?')) {// 检查session
            $name = substr($name, 1);
            if ($prefix) {
                return isset($_SESSION[$prefix][$name]);
            } else {
                return isset($_SESSION[$name]);
            }
        } elseif (is_null($name)) {// 清空session
            if ($prefix) {
                unset($_SESSION[$prefix]);
            } else {
                $_SESSION = array();
            }
        } elseif ($prefix) {// 获取session
            if (isset($_SESSION[$prefix][$name])) {
                return $_SESSION[$prefix][$name];
            } else {
                return null;
            }
        } else {
            return $_SESSION[$name];
        }
    } elseif (is_null($value)) {// 删除session
        if ($prefix) {
            unset($_SESSION[$prefix][$name]);
        } else {
            unset($_SESSION[$name]);
        }
    } else {// 设置session
        if ($prefix) {
            if (isset($_SESSION[$prefix]) && !is_array($_SESSION[$prefix])) {
                $_SESSION[$prefix] = array();
            }
            $_SESSION[$prefix][$name] = $value;
        } else {
            $_SESSION[$name] = $value;
        }
    }
}

/**
 * Cookie 设置、获取、删除
 * @param $name
 * @param string $value
 * @param null $option
 * @return null|void
 */
function cookie($name, $value = '', $option = null)
{
    // 默认设置
    $config = array('prefix' => "myf", // cookie 名称前缀
        'expire' => '36000', // cookie 保存时间
        'path' => '.', // cookie 保存路径
        'domain' => null, // cookie 有效域名
    );
    // 参数设置(会覆盖黙认设置)
    if (!empty($option)) {
        if (is_numeric($option))
            $option = array('expire' => $option);
        elseif (is_string($option))
            parse_str($option, $option);
        $config = array_merge($config, array_change_key_case($option));
    }
    // 清除指定前缀的所有cookie
    if (is_null($name)) {
        if (empty($_COOKIE))
            return;
        // 要删除的cookie前缀，不指定则删除config设置的指定前缀
        $prefix = empty($value) ? $config['prefix'] : $value;
        if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
            foreach ($_COOKIE as $key => $val) {
                if (0 === stripos($key, $prefix)) {
                    setcookie($key, '', time() - 3600, $config['path'], $config['domain']);
                    unset($_COOKIE[$key]);
                }
            }
        }
        return;
    }
    $name = $config['prefix'] . $name;
    if ('' === $value) {
        return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
        // 获取指定Cookie
    } else {
        if (is_null($value)) {
            setcookie($name, '', time() - 3600, $config['path'], $config['domain']);
            unset($_COOKIE[$name]);
            // 删除指定cookie
        } else {
            // 设置cookie
            $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
            setcookie($name, $value, $expire, $config['path'], $config['domain']);
            $_COOKIE[$name] = $value;
        }
    }
}



/**
 * 对象输出
 * @param type $var
 * @param type $echo
 * @param type $label
 * @param type $strict
 * @return string|null
 */
function dump($var, $echo = true, $label = null, $strict = true)
{
    $label = ($label === null) ? '' : rtrim($label) . ' ';
    if (!$strict) {
        if (ini_get('html_errors')) {
            $output = print_r($var, true);
            $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
        } else {
            $output = $label . print_r($var, true);
        }
    } else {
        ob_start();
        var_dump($var);
        $output = ob_get_clean();
        if (!extension_loaded('xdebug')) {
            $output = preg_replace("/\]\=\>\n(\s+)/m", '] => ', $output);
            $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
        }
    }
    if ($echo) {
        echo($output);
        return null;
    } else {
        return $output;
    }
}

/**
 * 获取客户端IP
 * @staticvar null $ip
 * @return null
 */
function getClientIP()
{
    static $ip = NULL;
    if ($ip !== NULL) {
        return $ip;
    }
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos = array_search('unknown', $arr);
        if (false !== $pos)
            unset($arr[$pos]);
        $ip = trim($arr[0]);
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $ip = (false !== ip2long($ip)) ? $ip : '0.0.0.0';
    return $ip;
}



/**
 * GET请求
 * @param String $name 变量
 * @param $default 默认值
 * @return value
 */
function get($name, $default = null)
{
    if (isset($_GET[$name])) {
        $value = $_GET[$name];
    } else {
        $value = $default;
    }
    return $value;
}


/**
 * 读取POST值
 * @param String $name 变量
 * @param $default 默认值
 * @return value
 */
function post($name, $default = null)
{
    if (isset($_POST[$name])) {
        $value = $_POST[$name];
        return $value;
    } else {
        return $default;
    }
}


/**
 * 读取请求数据
 * @param String $name
 * @param $default null
 * @return value
 */
function request($name, $default = null)
{
    if (isset($_REQUEST[$name])) {
        return $_REQUEST[$name];
    } else {
        return $default;
    }
}


/**
 * 获取Integer变量
 * @param String $name
 * @param $default null
 * @return NULL|number
 */
function getInteger($name, $default = null)
{
    if (isset($_REQUEST[$name])) {
        $value = $_REQUEST[$name];
        if (!is_numeric($value)) {
            return $default;
        } else {
            return intval($value);
        }
    } else {
        return null;
    }
}

/**
 * 获取Double变量
 * @param String $name
 * @param $default null
 * @return NULL|number
 */
function getDouble($name, $default = null)
{
    if (isset($_REQUEST[$name])) {
        $value = $_REQUEST[$name];
        if (!is_numeric($value)) {
            return $default;
        } else {
            return (double)$value;
        }
    } else {
        return null;
    }
}

/**
 * 读取header参数值
 * @param $name
 * @return null
 */
function getHeader($name) {
    $headers = em_getallheaders();
    if (isset($headers[$name])) {
        return $headers[$name];
    } else {
        return null;
    }
}

/**
 * 读取所有的header信息
 * @return mixed
 */
function em_getallheaders() {
    foreach ($_SERVER as $name => $value) {
        if (substr($name, 0, 5) == 'HTTP_') {
            $headers[str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($name, 5))))] = $value;
        }
    }
    return $headers;
}

/**
 * 获取api参数，先从参数中获取，如果没有再从heander中获取
 * @param String $name
 * @return type
 */
function getApiParam($name) {
    $value = request($name);
    if (!isset($value)) {
        $value = getHeader($name);
    }
    return $value;
}

//获取控制器名称
function getControllerName() {
    $urls = session("_urls");
    return $urls["_c"];
}

//获取访问方法名称
function getActionName() {
    $urls = session("_urls");
    return $urls["_a"];
}

//输出json
function echoJson($data){
    header('Content-Type:application/json; charset=utf-8');
    if(is_string($data)){
        echo $data;
    }else{
        echo json_encode($data);
    }
}

/**************************************************************
 *
 *    将数组转换为JSON字符串（兼容中文）
 *    @param  array   $array      要转换的数组
 *    @return string      转换得到的json字符串
 *    @access public
 *
 *************************************************************/
function JSON($array) {
    $json = json_encode($array,JSON_UNESCAPED_UNICODE);
    return $json;
}

/**
 * 检查手机号是否合法,默认只要是11位，第一位为1的均可以被验证通过
 * @param string $mobile
 * @return boolean
 */
function checkMobile($mobile) {
    if (preg_match("/^1[0-9]{10}$/", $mobile)) {
        return true;
    } else {
        return false;
    }
}



/**
 * 字符串加密
 * @param string $original
 * @return string
 */
function encodePassword($original) {
    $encoder = md5(base64_encode($original . "_myfapi"));
    return $encoder;
}

/**
 * 生成token
 * @param int $userId
 * @return string
 */
function createToken($userId){
    $raw = array(
        'user_id' => (int) $userId,
        'ct' => time(),
        'salt' => rand(1,200000),
    );
    $token = \MyfApi\Libs\Coding::strEncode(json_encode($raw));
    return $token;
}

/**
 * 解析token
 * @param $token
 * @return mixed|null
 */
function parseToken($token){
    $decoded = \MyfApi\Libs\Coding::strDecode($token);
    $row = json_decode($decoded,true);
    if(!isset($row)){
        return null;
    }else{
        return $row;
    }
}